# 获取当前目录名称作为可执行文件名称
TARGET = $(notdir $(CURDIR))

# 编译器选择（默认使用g++，可以通过环境变量CXX覆盖）
CXX ?= g++

# 编译器标准版本（可以根据需要进行修改）
CXX_STD ?= -std=c++20

# 编译器选项 根据自己选择添加警告为错误选项 -Werror
CXXFLAGS = $(CXX_STD) -Iinc -Wall -Wextra -MMD -MP

# 源文件和目标文件目录
SRC_DIR = src
BUILD_DIR = build
INC_DIR = inc
SRC = $(wildcard $(SRC_DIR)/*.cpp)
OBJ = $(patsubst $(SRC_DIR)/%.cpp,$(BUILD_DIR)/%.o,$(SRC))
DEP = $(OBJ:.o=.d)

# 规则
all: $(TARGET)

$(TARGET): $(OBJ)
	$(CXX) $(CXXFLAGS) -o $@ $^

$(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp | $(BUILD_DIR)
	$(CXX) $(CXXFLAGS) -c $< -o $@

# 创建构建目录
$(BUILD_DIR):
	mkdir -p $(BUILD_DIR)

# 运行程序
run: $(TARGET)
	./$(TARGET)

# 清理
clean:
	rm -rf $(BUILD_DIR) $(TARGET)

# 包含依赖文件
-include $(DEP)

# 伪目标
.PHONY: all clean run
